#include "errorqueuemgr.h"
#include <QDebug>

ErrorQueueManager::ErrorQueueManager(QWidget* parent)
    : QObject(parent)
    , m_parentWidget(parent)
    , m_isShowingError(false)
{
    m_retryTimer.setSingleShot(true);
    m_retryTimer.setInterval(100); // 100ms后重试显示
    connect(&m_retryTimer, &QTimer::timeout, this, &ErrorQueueManager::checkAndShowNextError);
}

void ErrorQueueManager::addError(const QString& fieldId, const QString& errorMessage)
{
    // 如果该字段已经有错误，先移除旧的
    if (m_activeErrors.contains(fieldId)) {
        removeError(fieldId);
    }

    ErrorInfo error{fieldId, errorMessage};

    // 添加到活动错误映射
    m_activeErrors[fieldId] = error;

    // 添加到队列
    m_errorQueue.enqueue(error);

    qDebug() << "错误添加到队列:" << fieldId << "-" << errorMessage;
    qDebug() << "当前队列大小:" << m_errorQueue.size();

    // 尝试显示下一个错误
    checkAndShowNextError();
}

void ErrorQueueManager::removeError(const QString& fieldId)
{
    if (m_activeErrors.contains(fieldId)) {
        // 从活动错误中移除
        m_activeErrors.remove(fieldId);

        // 从队列中移除该字段的所有错误
        QQueue<ErrorInfo> newQueue;
        while (!m_errorQueue.isEmpty()) {
            ErrorInfo error = m_errorQueue.dequeue();
            if (error.fieldId != fieldId) {
                newQueue.enqueue(error);
            }
        }
        m_errorQueue = newQueue;

        qDebug() << "错误已移除:" << fieldId;
        qDebug() << "当前队列大小:" << m_errorQueue.size();

        // 如果移除了当前正在显示的错误，立即显示下一个
        checkAndShowNextError();
    }
}

void ErrorQueueManager::clearAllErrors()
{
    m_errorQueue.clear();
    m_activeErrors.clear();
    m_isShowingError = false;
    m_retryTimer.stop();
}

bool ErrorQueueManager::hasErrors() const
{
    return !m_errorQueue.isEmpty();
}

int ErrorQueueManager::errorCount() const
{
    return m_errorQueue.size();
}

void ErrorQueueManager::checkAndShowNextError()
{
    if (m_isShowingError) {
        // 如果正在显示错误，等待完成后重试
        if (!m_retryTimer.isActive()) {
            m_retryTimer.start();
        }
        return;
    }

    if (!m_errorQueue.isEmpty()) {
        // 显示队列中的下一个错误
        showNextError();
    }
}

void ErrorQueueManager::showNextError()
{
    if (m_errorQueue.isEmpty()) {
        m_isShowingError = false;
        return;
    }

    m_isShowingError = true;
    ErrorInfo error = m_errorQueue.head(); // 查看队列头部但不移除

    qDebug() << "正在显示错误:" << error.fieldId << "-" << error.message;

    // 显示Toast
    Toast::error(error.message, m_parentWidget, 3000);

    // 设置定时器，在Toast显示完成后继续下一个
    QTimer::singleShot(3200, this, &ErrorQueueManager::onToastFinished);
}

void ErrorQueueManager::onToastFinished()
{
    if (!m_errorQueue.isEmpty()) {
        // 移除刚刚显示的错误
        m_errorQueue.dequeue();
    }

    m_isShowingError = false;

    // 显示下一个错误
    checkAndShowNextError();
}
